package com.imut.lagain.service;
import org.slf4j.LoggerFactory;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.imut.lagain.entity.MemoryCapsule;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 记忆胶囊服务接口
 */
public interface IMemoryCapsuleService extends IService<MemoryCapsule> {
    
    /**
     * 获取所有胶囊，按最后活跃时间倒序排列
     * @return 胶囊列表
     */
    List<MemoryCapsule> getAllCapsulesOrderByLastActiveTime();
    
    /**
     * 创建新的记忆胶囊
     * @param userId 用户ID
     * @param title 标题
     * @param description 描述
     * @param coverImageUrl 封面图片URL
     * @param type 胶囊类型
     * @param openTime 开启时间
     * @param accessPassword 访问密码
     * @return 创建的胶囊
     */
    MemoryCapsule createCapsule(Long userId, String title, String description, String coverImageUrl, 
                               String type, LocalDateTime openTime, String accessPassword);
    
    /**
     * 更新胶囊的最后活跃时间
     * @param capsuleId 胶囊ID
     */
    void updateLastActiveTime(Long capsuleId);
    
    /**
     * 根据ID获取胶囊详情
     * @param capsuleId 胶囊ID
     * @return 胶囊信息
     */
    MemoryCapsule getCapsuleById(Long capsuleId);
    
    /**
     * 根据用户ID获取胶囊列表
     * @param userId 用户ID
     * @param page 分页参数
     * @return 胶囊分页列表
     */
    IPage<MemoryCapsule> getCapsulesByUserId(Long userId, Page<MemoryCapsule> page);
    
    /**
     * 获取用户的胶囊列表
     * @param userId 用户ID
     * @param page 页码
     * @param size 每页大小
     * @return 胶囊分页列表
     */
    IPage<MemoryCapsule> getUserCapsules(Long userId, Integer page, Integer size);
    
    /**
     * 根据状态获取用户的胶囊列表
     * @param userId 用户ID
     * @param status 状态
     * @param page 页码
     * @param size 每页大小
     * @return 胶囊分页列表
     */
    IPage<MemoryCapsule> getUserCapsulesByStatus(Long userId, Integer status, Integer page, Integer size);
    
    /**
     * 根据分享码获取胶囊
     * @param shareCode 分享码
     * @return 胶囊信息
     */
    MemoryCapsule getCapsuleByShareCode(String shareCode);
    
    /**
     * 根据状态获取胶囊列表
     * @param status 状态
     * @param page 分页参数
     * @return 胶囊分页列表
     */
    IPage<MemoryCapsule> getCapsulesByStatus(String status, Page<MemoryCapsule> page);
    
    /**
     * 根据类型获取胶囊列表
     * @param type 类型
     * @param page 分页参数
     * @return 胶囊分页列表
     */
    IPage<MemoryCapsule> getCapsulesByType(String type, Page<MemoryCapsule> page);
    
    /**
     * 根据标题模糊查询胶囊
     * @param title 标题关键字
     * @param page 分页参数
     * @return 胶囊分页列表
     */
    IPage<MemoryCapsule> searchCapsulesByTitle(String title, Page<MemoryCapsule> page);
    
    /**
     * 获取即将开启的胶囊
     * @param beforeTime 时间范围
     * @return 胶囊列表
     */
    List<MemoryCapsule> getCapsulesAboutToOpen(LocalDateTime beforeTime);
    
    /**
     * 获取指定时间范围内即将开启的胶囊
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 胶囊列表
     */
    List<MemoryCapsule> findCapsulesAboutToOpen(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取已到开启时间的胶囊
     * @param currentTime 当前时间
     * @return 胶囊列表
     */
    List<MemoryCapsule> findCapsulesReadyToOpen(LocalDateTime currentTime);
    
    /**
     * 获取过期的临时胶囊
     * @param expireTime 过期时间
     * @return 胶囊列表
     */
    List<MemoryCapsule> findExpiredTempCapsules(LocalDateTime expireTime);
    
    /**
     * 统计胶囊数量
     * @param userId 用户ID（null表示所有用户）
     * @param status 状态（null表示所有状态）
     * @param type 类型（null表示所有类型）
     * @return 胶囊数量
     */
    Long countCapsules(Long userId, String status, String type);
    
    /**
     * 根据状态统计胶囊数量
     * @param status 胶囊状态
     * @return 胶囊数量
     */
    Long countByStatus(String status);
    
    /**
     * 根据用户ID和状态查询胶囊列表
     * @param userId 用户ID
     * @param status 状态字符串（"sealed" 或 "opened"）
     * @return 胶囊列表
     */
    List<MemoryCapsule> findByUserIdAndStatus(Long userId, String status);
    
    /**
     * 更新胶囊状态
     * @param capsuleId 胶囊ID
     * @param status 新状态
     * @return 是否更新成功
     */
    boolean updateCapsuleStatus(Long capsuleId, String status);
    
    /**
     * 更新胶囊信息
     * @param capsuleId 胶囊ID
     * @param title 标题
     * @param description 描述
     * @param coverImageUrl 封面图片URL
     * @param type 胶囊类型
     * @param openTime 开启时间
     * @param accessPassword 访问密码
     * @return 是否更新成功
     */
    boolean updateCapsule(Long capsuleId, String title, String description, String coverImageUrl, 
                          String type, LocalDateTime openTime, String accessPassword);
    
    /**
     * 更新胶囊信息
     * @param capsule 胶囊信息
     * @return 是否更新成功
     */
    boolean updateCapsule(MemoryCapsule capsule);
    
    /**
     * 删除胶囊
     * @param capsuleId 胶囊ID
     * @return 是否删除成功
     */
    boolean deleteCapsule(Long capsuleId);
    
    /**
     * 封存胶囊
     * @param capsuleId 胶囊ID
     * @return 是否封存成功
     */
    boolean sealCapsule(Long capsuleId);
    
    /**
     * 软删除胶囊
     * @param capsuleId 胶囊ID
     * @return 是否删除成功
     */
    boolean softDeleteCapsule(Long capsuleId);
    
    /**
     * 恢复已删除的胶囊
     * @param capsuleId 胶囊ID
     * @return 是否恢复成功
     */
    boolean restoreCapsule(Long capsuleId);
    
    /**
     * 检查分享码是否存在
     * @param shareCode 分享码
     * @return 是否存在
     */
    boolean shareCodeExists(String shareCode);
    
    /**
     * 验证访问密码
     * @param capsuleId 胶囊ID
     * @param password 密码
     * @return 是否验证成功
     */
    boolean validateAccessPassword(Long capsuleId, String password);
}
